package src.C_io;

import java.io.*;
import java.nio.charset.Charset;

// 打印流
public class Demo14 {
    public static void main(String[] args) throws IOException {
        /*
          定义：
            打印流也是高级流，用来包装基本流
          分类：
            字节打印流（PrintStream），字符打印流（PrintWriter）
          特点：
            1、打印流只操作文件目的地，不操作数据源（ps：它不能读取，只能写出）
            2、特有的写出方法可以实现，数据原样写出（ps：打印 97  文件中 97）
            3、特有的写出方法，可以实现自动刷新，自动换行（ps：打印一次数据 = 写出 + 换行 + 刷新）
        */

        // 字节打印流（PrintStream）       字节输出流，自动刷新(字节流底层没缓冲区开不开无所谓)，字符编码
        PrintStream ps = new PrintStream(new FileOutputStream("src/C_io/a.txt"),true,"UTF-8");
        ps.println(97); // 写出 + 自动刷新 + 自动换行
        ps.print(true);
        ps.println();
        ps.printf("%s爱上了%s","阿珍","阿强"); // 带占位符的打印语句，不换行
        ps.close();

        // 字符打印流（PrintStream） 和上面基本一样      字符输出流，自动刷新(字符流底层有缓冲区需要手动开启刷新)
        PrintWriter pw = new PrintWriter(new FileWriter("src/C_io/b.txt"),true);
        pw.println(97); // 写出 + 自动刷新 + 自动换行
        pw.print(true);
        pw.println();
        pw.printf("%s爱上了%s","阿珍","阿强"); // 带占位符的打印语句，不换行
        pw.close();

        //拓展：打印流的应用场景
        System.out.printf("123");
        // 它是一个特殊的打印流，又叫系统中的 标准输出流 ，是不能关闭的，在系统中是唯一的 .close() 也没用，除非虚拟机关闭
        // 获取打印流对象，此打印流在虚拟机启动的时候，由虚拟机创建，默认指向控制台
        PrintStream ps1 = System.out;
        // 调用 .println() 方法，原理和上面一样
        ps1.println("123");
    }
}
